package util

import (
	"net/http"
	"reflect"
	"strconv"
	"fmt"
)
/*
flag 决定解析类型 1 multidata 2 www form data 3 query
v 为传入值（结构体），必须为指针（引用）
注意：并不能解析文件上传的data
*/
func FormParse(r *http.Request,v interface{},flag int8){
	vs := reflect.ValueOf(v).Elem()
	vt := reflect.TypeOf(v).Elem()
	/*fmt.Println(vs)
	fmt.Println(vt)*/
	for i:=0;i<vs.NumField();i++{
		fieldv := vs.Field(i)
		formName := vt.Field(i).Tag.Get("form")
		fmt.Println(fieldv)
		fmt.Println(formName)
		if len(formName) == 0{
			continue
		}
		var values string
		values = ""
		// form解析
		if flag==1 || flag==2{
			r.ParseForm()
			fs,ok:=r.Form[formName]
			if !ok{
				continue
			}
			values = fs[0]
		}
		// query解析
		if flag==3 {
			values = r.URL.Query().Get(formName)
			if len(values)==0{
				continue
			}
		}

		// 赋值
		switch fieldv.Kind(){
		case reflect.Int:
			vf,err:=strconv.ParseInt(values,10,32)
			if err==nil{
				fieldv.SetInt(vf)
			}

		case reflect.String:
			fieldv.SetString(values)

		case reflect.Bool:
			vf,err:=strconv.ParseBool(values)
			if err==nil{
				fieldv.SetBool(vf)
			}

		case reflect.Float32:
			vf,err:=strconv.ParseFloat(values,32)
			if err==nil{
				fieldv.SetFloat(vf)
			}

		}

	}
}